package main

import (
	"fmt"
	"net"
	"strings"
)

type User struct {
	Name   string
	Addr   string
	C      chan string
	Conn   net.Conn
	server *Server
}

// 创建一个用户

func NewUser(conn net.Conn, server *Server) *User {

	userAddr := conn.RemoteAddr().String()

	user := &User{
		Name:   userAddr,
		Addr:   userAddr,
		C:      make(chan string),
		Conn:   conn,
		server: server,
	}

	// 启动监听
	go user.ListenMessage()

	return user
}

func (user *User) handleUserMsg(msg string) {

	if msg == "online" {
		// 向用户发送目前在线的用户信息
		for _, v := range user.server.OnlineUserMap {
			userInfo := fmt.Sprintf("[(%s)%s]当前在线\n", v.Addr, v.Name)
			user.Conn.Write([]byte(userInfo))
		}
	} else if strings.Contains(msg, "rename@") {
		// 更改名字
		cmdArr := strings.Split(msg, "@")
		var operInfo string
		if cmdArr[1] != "" {
			// 有效名称
			user.server.mapLock.Lock()
			delete(user.server.OnlineUserMap, user.Name)
			user.Name = cmdArr[1]
			user.server.OnlineUserMap[user.Name] = user
			user.server.mapLock.Unlock()
			operInfo = "修改名称成功！"
		} else {
			operInfo = "本次输入的名称无效"
		}
		user.Conn.Write([]byte(operInfo))
	} else {
		// 广播用户发送的消息
		user.server.broadcast(user, msg)
	}

}

// 监听当前user的channel  一旦有新消息  就发送给客户端
func (user *User) ListenMessage() {
	for {
		msg := <-user.C
		user.Conn.Write([]byte(msg + "\n"))
	}
}

// 用户的上线功能
func (user *User) Online() {
	// 用户上线  将用户加入在线列表
	user.server.mapLock.Lock()
	user.server.OnlineUserMap[user.Name] = user
	user.server.mapLock.Unlock()

	// 广播用户上线消息
	user.server.broadcast(user, "上线了！")
}

// 用户的下线功能
func (user *User) Offline() {
	// 用户下  将用户删除在线列表
	user.server.mapLock.Lock()
	delete(user.server.OnlineUserMap, user.Name)
	// user.server.OnlineUserMap[user.Name] = user
	user.server.mapLock.Unlock()

	// 广播用户下线消息
	user.server.broadcast(user, "下线了！")
}
